// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_COMPILER_VERIFIER_H_
#define V8_COMPILER_VERIFIER_H_

#include "src/base/macros.h"
#include "src/globals.h"

namespace v8 {
namespace internal {
    namespace compiler {

        class Graph;
        class Edge;
        class Node;
        class Schedule;

        // Verifies properties of a graph, such as the well-formedness of inputs to
        // each node, etc.
        class Verifier {
        public:
            enum Typing { TYPED,
                UNTYPED };
            enum CheckInputs { kValuesOnly,
                kAll };
            enum CodeType { kDefault,
                kWasm };

            static void Run(Graph* graph, Typing typing = TYPED,
                CheckInputs check_inputs = kAll,
                CodeType code_type = kDefault);

#ifdef DEBUG
            // Verifies consistency of node inputs and uses:
            // - node inputs should agree with the input count computed from
            //   the node's operator.
            // - effect inputs should have effect outputs.
            // - control inputs should have control outputs.
            // - frame state inputs should be frame states.
            // - if the node has control uses, it should produce control.
            // - if the node has effect uses, it should produce effect.
            // - if the node has frame state uses, it must be a frame state.
            static void VerifyNode(Node* node);

            // Verify that {replacement} has the required outputs
            // (effect, control or frame state) to be used as an input for {edge}.
            static void VerifyEdgeInputReplacement(const Edge& edge,
                const Node* replacement);
#else
            static void VerifyNode(Node* node)
            {
            }
            static void VerifyEdgeInputReplacement(const Edge& edge,
                const Node* replacement) { }
#endif // DEBUG

        private:
            class Visitor;
            DISALLOW_COPY_AND_ASSIGN(Verifier);
        };

        // Verifies properties of a schedule, such as dominance, phi placement, etc.
        class V8_EXPORT_PRIVATE ScheduleVerifier {
        public:
            static void Run(Schedule* schedule);
        };
    } // namespace compiler
} // namespace internal
} // namespace v8

#endif // V8_COMPILER_VERIFIER_H_
